package com.example.response.config;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/** #http://localhost:8080/doc.html#/home
 * knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!
 * 由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j
 * 为了契合微服务的架构发展,更名后主要专注的方面:
 *  1.前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活
 *  2.提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分
 */
@Configuration
@EnableSwagger2
@EnableKnife4j
public class Swagger2Config {

    @Value("${swagger.enable}")
    private boolean enable;

    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2) // 指定api类型为swagger2
                .enable(enable)
                .apiInfo(apiInfo()) // 用于定义api文档汇总信息
                .groupName("1.0版本") // 分组名称
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.response.controller")) //指定要扫描的controller包路径
                .paths(PathSelectors.any()) // 所有controller
                .build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("用户测试接口API") // 文档页标题
                .contact(new Contact("dangwen","www.baidu.com","dowin.dang@easemob.com")) // 联系人信息
                .description("专为用户测试提供的api文档") // 详细信息
                .version("0.0.1") // 文档版本号
                .termsOfServiceUrl("www.dangwen.com") // 网站地址
                .build();
    }
    /**
     * 1、常用注解介绍
     * @Api()
     * 作用在类上，用来标注该类具体实现内容。
     * 参数：
     * tags：类标签，一般用来写类的名称或作用。（常用）
     * description：可描述描述该类作用。
     *
     * @ApiOperation()
     * 用于方法的说明
     * 参数：
     * value ：方法说明（常用）
     * notes ：注释说明
     * httpMethod ： 说明这个方法被请求的方式
     * response ：方法的返回值的类型
     *
     * @ApiOperationSupport()
     * （knife4j增加特性）用于接口方法排序，作者信息描述等。
     * 参数：
     * order：排序
     * author：作者信息
     *
     * @ApiImplicitParam()
     * 对单个参数的说明
     * 参数：
     * name ：参数名。
     * value ： 参数的具体意义，作用。（常用）
     * required ： 参数是否必填。 （常用）
     * dataType ：参数的数据类型。 （常用）
     * paramType ：查询参数类型，这里有几种形式：
     * 类型　　　　　作用
     * path 　　　以地址的形式提交数据
     * query 　　直接跟参数完成自动映射赋值
     * body　　　以流的形式提交 仅支持POST
     * header　　参数在request headers 里边提交
     * form　　　以form表单的形式提交 仅支持POST
     *
     * @ApiModel()
     * 用于描述一个数据模型的信息，即我们常用的实体、VO类、DTO类等描述
     * 参数：
     * value ： 数据模型名称。（常用）
     * description:具体描述
     * parent：父类
     *
     * @ApiModelProperty()
     * 用于描述数据模型的属性信息
     * 参数：
     * value：字段说明 （常用）
     * name：重写属性名字
     * dataType：重写属性类型
     * required：是否必填 （常用）
     * example：举例说明 （常用）
     * hidden：隐藏
     *
     * @ApiIgnore
     * 自动生成接口说明时忽略
     * .....
     */

}
